/**
 * @file tsk_tskp.c
 * @brief tskp库 - 任务调参整体接口实现文件
 * @details
 * 本文件实现了tskp任务调参库的整体接口，包括调度器、解析器、命令存储等模块的初始化、任务注册、命令添加、数据推送、调度与处理等功能。
 * 适用于嵌入式、实时系统下的远程参数调节、任务调度与命令解析等场景。
 *
 * 作者：小傲（个人开发）
 * 邮箱：2655640770@qq.com
 * 版权声明：开源公开，欢迎建议与反馈
 * 日期：2025-09-11
 */

#include"tsk_tskp.h"

#ifdef _TSK_TSKP_

/**
 * @brief        // 初始化tskp结构体，包括调度器和解析器
 * @param[in]    // tskp  : 指向要初始化的tsk_tskp_t结构体的指针
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_tskp_Init(tsk_tskp_t* tskp){
    tsk_analy_Init(&tskp->analy);
    tsk_task_Init(&tskp->sched);
    #if TSK_TASK_DEBUG
        #if CHINESE_SUPPORT
            printf("[整体]调度器和解析器已初始化,调度器:%p,解析器:%p\r\n",&tskp->sched,&tskp->analy);
            printf("[整体]占用内存%d字节\r\n",sizeof(*tskp));
        #else
            printf("[All] Scheduler and analyzer initialized, Scheduler:%p, Analyzer:%p\r\n",&tskp->sched,&tskp->analy);
            printf("[All] Occupies %d bytes of memory\r\n",sizeof(*tskp));
        #endif
        fflush(stdout);
    #endif
}


/**
 * @brief        // 设置任务优先级
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // id       : 任务ID
 * @param[in]    // priority : 任务优先级
 * @return       // tsk_task_enum_t : 任务操作结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_enum_t tsk_tskp_task_setpriority(tsk_tskp_t* tskp,uint8_t id,int priority){
    if(tsk_task_setpriority(&tskp->sched,id,priority)!=TSK_TASK_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]任务优先级修改失败\r\n");
            #else
                printf("[Error] Failed to change task priority\r\n");
            #endif
            fflush(stdout);
        #endif
        return TSK_TASK_ERROR;
    }
    return TSK_TASK_OK;
}

#if TSK_CMD_SWITCH

/**
 * @brief        // 添加命令到命令存储器
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // id       : 任务ID
 * @param[in]    // cmd      : 命令字符串
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_tskp_add_cmd(tsk_tskp_t* tskp,uint8_t id,const char * cmd){
    if(!tsk_add_cmd(&tskp->analy.cmdstore,id,cmd)){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]命令添加失败\r\n");
            #else
                printf("[Error] Failed to add command\r\n");
            #endif
            fflush(stdout);
        #endif
    }
}

#endif 

/**
 * @brief        // 注册任务到调度器
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // id       : 任务ID
 * @param[in]    // func     : 任务函数指针
 * @param[in]    // param    : 任务参数指针
 * @param[in]    // priority : 任务优先级
 * @return       // tsk_task_enum_t : 任务操作结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_enum_t tsk_tskp_register_task(tsk_tskp_t* tskp,
                                uint8_t id,
                                tsk_Func func,
                                void* param,
                                int priority){
    if(tsk_register_task(&tskp->sched,id,func,param,priority)!=TSK_TASK_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]任务添加失败\r\n");
            #else
                printf("[Error] Failed to add task\r\n");
            #endif
            fflush(stdout);
        #endif
        return TSK_TASK_ERROR;
    }
    return TSK_TASK_OK;
}

/**
 * @brief        // 启动任务调度器
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_tskp_start_TaskScheduler(tsk_tskp_t* tskp){
    tsk_start_TaskScheduler(&tskp->sched);
    #if TSK_TASK_DEBUG
        #if CHINESE_SUPPORT
            printf("[整体]调度器已启动\r\n");
        #else
            printf("[All] Scheduler started\r\n");
        #endif
        fflush(stdout);
    #endif
}

/**
 * @brief        // 停用任务调度器
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_tskp_stop_TaskScheduler(tsk_tskp_t* tskp){
    tsk_stop_TaskScheduler(&tskp->sched);
    #if TSK_TASK_DEBUG
        #if CHINESE_SUPPORT
            printf("[整体]调度器已停用\r\n");
        #else
            printf("[All] Scheduler stopped\r\n");
        #endif
        fflush(stdout);
    #endif
}

/**
 * @brief        // 注销任务
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // id       : 任务ID
 * @return       // tsk_task_enum_t : 任务操作结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_enum_t tsk_tskp_close_task(tsk_tskp_t* tskp,uint8_t id){
    if(tsk_close_task(&tskp->sched,id)!=TSK_TASK_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]任务注销失败\r\n");
            #else
                printf("[Error] Failed to unregister task\r\n");
            #endif
            fflush(stdout);
        #endif
        return TSK_TASK_ERROR;
    }
    return TSK_TASK_OK;
}

/**
 * @brief        // 停用任务
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // id       : 任务ID
 * @return       // tsk_task_enum_t : 任务操作结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_enum_t tsk_tskp_stop_task(tsk_tskp_t* tskp,uint8_t id){
    if(tsk_stop_task(&tskp->sched,id)!=TSK_TASK_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]任务停用失败\r\n");
            #else
                printf("[Error] Failed to stop task\r\n");
            #endif
            fflush(stdout);
        #endif
        return TSK_TASK_ERROR;
    }
    return TSK_TASK_OK;
}

/**
 * @brief        // 启用任务
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // id       : 任务ID
 * @return       // tsk_task_enum_t : 任务操作结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_enum_t tsk_tskp_start_task(tsk_tskp_t* tskp,uint8_t id){
    if(tsk_start_task(&tskp->sched,id)!=TSK_TASK_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]任务启用失败\r\n");
            #else
                printf("[Error] Failed to start task\r\n");
            #endif
            fflush(stdout);
        #endif
        return TSK_TASK_ERROR;
    }
    return TSK_TASK_OK;
}

/**
 * @brief        // 调度一个优先级内的一个任务
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // priority : 任务优先级
 * @return       // tsk_task_enum_t : 任务操作结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_task_enum_t tsk_tskp_Run_Priority_TaskScheduler(tsk_tskp_t* tskp,int priority){
    if(tsk_Run_Priority_TaskScheduler(&tskp->sched,priority)!=TSK_TASK_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]任务调度失败\r\n");
            #else
                printf("[Error] Task scheduling failed\r\n");
            #endif
            fflush(stdout);
        #endif
        return TSK_TASK_ERROR;
    }
    return TSK_TASK_OK;
}

/**
 * @brief        // 把数据推送到解析队列
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @param[in]    // data     : 要推送的数据
 * @return       // tsk_task_enum_t : 任务操作结果
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
tsk_analy_queue_enum_t tsk_tskp_Push(tsk_tskp_t* tskp,char data){
    if(Tsk_analy_Queue_Push(&tskp->analy.analy_Queue,data)!=TSK_ANALY_QUEUE_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[警告]队列已满无法存入\r\n");
            #else
                printf("[Warning] Queue full, cannot push\r\n");
            #endif
            fflush(stdout);
        #endif
        return TSK_ANALY_QUEUE_FULL;
    }
    return TSK_ANALY_QUEUE_OK;
}

/**
 * @brief        // 任务处理函数，包含数据解析和任务调度
 * @param[in]    // tskp     : 指向tsk_tskp_t结构体的指针
 * @return       // void
 * @note         // 无
 * @author       // 小傲
 * @date         // 2025-09-11
 */
void tsk_task_handler(tsk_tskp_t* tskp){
    tsk_dis_data(&tskp->analy,&tskp->sched);//字符串处理
    if(tsk_Run_TaskScheduler(&tskp->sched)!=TSK_TASK_OK){
        #if TSK_TASK_DEBUG
            #if CHINESE_SUPPORT
                printf("[错误]调度器未初始化,调度器:%p\r\n",&tskp->sched);
            #else
                printf("[Error] Scheduler not initialized, Scheduler:%p\r\n",&tskp->sched);
            #endif
            fflush(stdout);
        #endif
    }
}

#endif // _TSK_TSKP_

